{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import absolute_import, division, print_function, unicode_literals\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载数据集\n",
    "imdb = keras.datasets.imdb\n",
    "\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training entries: 25000, labels: 25000\n",
      "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]\n"
     ]
    }
   ],
   "source": [
    "#  分析数据格式\n",
    "#  每个样本都是一个表示影评中词汇的整数数组。每个标签都是一个值为 0 或 1 的整数值，其中 0 代表消极评论，1 代表积极评论。\n",
    "print(\"Training entries: {}, labels: {}\".format(len(train_data), len(train_labels)))\n",
    "# 评论文本被转换为整数值，其中每个整数代表词典中的一个单词。\n",
    "# print(train_data[0])\n",
    "\n",
    "# 将整数换回单词\n",
    "word_index = imdb.get_word_index()\n",
    "word_index = {k:(v+3) for k,v in word_index.items()}\n",
    "word_index[\"<PAD>\"] = 0\n",
    "word_index[\"<START>\"] = 1\n",
    "word_index[\"<UNK>\"] = 2  # unknown\n",
    "word_index[\"<UNUSED>\"] = 3\n",
    "\n",
    "reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])\n",
    "\n",
    "def decode_review(text):\n",
    "    return ' '.join([reverse_word_index.get(i, '?') for i in text])\n",
    "\n",
    "# decode_review(train_data[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用 pad_sequences 函数来使长度标准化\n",
    "train_data = keras.preprocessing.sequence.pad_sequences(train_data,\n",
    "                                                        value=word_index[\"<PAD>\"],\n",
    "                                                        padding='post',\n",
    "                                                        maxlen=256)\n",
    "\n",
    "test_data = keras.preprocessing.sequence.pad_sequences(test_data,\n",
    "                                                       value=word_index[\"<PAD>\"],\n",
    "                                                       padding='post',\n",
    "                                                       maxlen=256)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 构建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_2\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_2 (Embedding)      (None, None, 16)          160000    \n",
      "_________________________________________________________________\n",
      "global_average_pooling1d_2 ( (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 16)                272       \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 1)                 17        \n",
      "=================================================================\n",
      "Total params: 160,289\n",
      "Trainable params: 160,289\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "Train on 15000 samples, validate on 10000 samples\n",
      "Epoch 1/40\n",
      "15000/15000 [==============================] - 2s 113us/sample - loss: 0.6914 - accuracy: 0.5371 - val_loss: 0.6891 - val_accuracy: 0.6744\n",
      "Epoch 2/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.6842 - accuracy: 0.7087 - val_loss: 0.6795 - val_accuracy: 0.6790\n",
      "Epoch 3/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.6693 - accuracy: 0.7287 - val_loss: 0.6603 - val_accuracy: 0.7509\n",
      "Epoch 4/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.6428 - accuracy: 0.7677 - val_loss: 0.6303 - val_accuracy: 0.7704\n",
      "Epoch 5/40\n",
      "15000/15000 [==============================] - 1s 41us/sample - loss: 0.6048 - accuracy: 0.7945 - val_loss: 0.5914 - val_accuracy: 0.7891\n",
      "Epoch 6/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.5586 - accuracy: 0.8162 - val_loss: 0.5479 - val_accuracy: 0.8074\n",
      "Epoch 7/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.5097 - accuracy: 0.8348 - val_loss: 0.5031 - val_accuracy: 0.8240\n",
      "Epoch 8/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.4617 - accuracy: 0.8516 - val_loss: 0.4630 - val_accuracy: 0.8357\n",
      "Epoch 9/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.4200 - accuracy: 0.8643 - val_loss: 0.4279 - val_accuracy: 0.8469\n",
      "Epoch 10/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.3829 - accuracy: 0.8759 - val_loss: 0.4000 - val_accuracy: 0.8542\n",
      "Epoch 11/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.3522 - accuracy: 0.8853 - val_loss: 0.3771 - val_accuracy: 0.8592\n",
      "Epoch 12/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.3264 - accuracy: 0.8919 - val_loss: 0.3590 - val_accuracy: 0.8644\n",
      "Epoch 13/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.3042 - accuracy: 0.8971 - val_loss: 0.3440 - val_accuracy: 0.8710\n",
      "Epoch 14/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.2851 - accuracy: 0.9027 - val_loss: 0.3318 - val_accuracy: 0.8740\n",
      "Epoch 15/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.2691 - accuracy: 0.9085 - val_loss: 0.3238 - val_accuracy: 0.8719\n",
      "Epoch 16/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.2539 - accuracy: 0.9131 - val_loss: 0.3149 - val_accuracy: 0.8763\n",
      "Epoch 17/40\n",
      "15000/15000 [==============================] - 1s 47us/sample - loss: 0.2408 - accuracy: 0.9169 - val_loss: 0.3087 - val_accuracy: 0.8775\n",
      "Epoch 18/40\n",
      "15000/15000 [==============================] - 1s 49us/sample - loss: 0.2280 - accuracy: 0.9224 - val_loss: 0.3022 - val_accuracy: 0.8801\n",
      "Epoch 19/40\n",
      "15000/15000 [==============================] - 1s 49us/sample - loss: 0.2168 - accuracy: 0.9257 - val_loss: 0.2976 - val_accuracy: 0.8832\n",
      "Epoch 20/40\n",
      "15000/15000 [==============================] - 1s 49us/sample - loss: 0.2069 - accuracy: 0.9294 - val_loss: 0.2939 - val_accuracy: 0.8828\n",
      "Epoch 21/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1973 - accuracy: 0.9334 - val_loss: 0.2912 - val_accuracy: 0.8837\n",
      "Epoch 22/40\n",
      "15000/15000 [==============================] - 1s 41us/sample - loss: 0.1884 - accuracy: 0.9381 - val_loss: 0.2894 - val_accuracy: 0.8833\n",
      "Epoch 23/40\n",
      "15000/15000 [==============================] - 1s 41us/sample - loss: 0.1802 - accuracy: 0.9419 - val_loss: 0.2877 - val_accuracy: 0.8847\n",
      "Epoch 24/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.1721 - accuracy: 0.9445 - val_loss: 0.2863 - val_accuracy: 0.8843\n",
      "Epoch 25/40\n",
      "15000/15000 [==============================] - 1s 41us/sample - loss: 0.1650 - accuracy: 0.9473 - val_loss: 0.2864 - val_accuracy: 0.8854\n",
      "Epoch 26/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1580 - accuracy: 0.9506 - val_loss: 0.2857 - val_accuracy: 0.8849\n",
      "Epoch 27/40\n",
      "15000/15000 [==============================] - 1s 40us/sample - loss: 0.1516 - accuracy: 0.9535 - val_loss: 0.2860 - val_accuracy: 0.8857\n",
      "Epoch 28/40\n",
      "15000/15000 [==============================] - 1s 41us/sample - loss: 0.1453 - accuracy: 0.9563 - val_loss: 0.2884 - val_accuracy: 0.8848\n",
      "Epoch 29/40\n",
      "15000/15000 [==============================] - 1s 55us/sample - loss: 0.1398 - accuracy: 0.9583 - val_loss: 0.2876 - val_accuracy: 0.8856\n",
      "Epoch 30/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.1338 - accuracy: 0.9611 - val_loss: 0.2886 - val_accuracy: 0.8851\n",
      "Epoch 31/40\n",
      "15000/15000 [==============================] - 1s 50us/sample - loss: 0.1286 - accuracy: 0.9630 - val_loss: 0.2901 - val_accuracy: 0.8861\n",
      "Epoch 32/40\n",
      "15000/15000 [==============================] - 1s 51us/sample - loss: 0.1238 - accuracy: 0.9643 - val_loss: 0.2914 - val_accuracy: 0.8854\n",
      "Epoch 33/40\n",
      "15000/15000 [==============================] - 1s 46us/sample - loss: 0.1186 - accuracy: 0.9665 - val_loss: 0.2937 - val_accuracy: 0.8853\n",
      "Epoch 34/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.1140 - accuracy: 0.9689 - val_loss: 0.2959 - val_accuracy: 0.8843\n",
      "Epoch 35/40\n",
      "15000/15000 [==============================] - 1s 46us/sample - loss: 0.1095 - accuracy: 0.9701 - val_loss: 0.2978 - val_accuracy: 0.8849\n",
      "Epoch 36/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.1053 - accuracy: 0.9715 - val_loss: 0.3004 - val_accuracy: 0.8841\n",
      "Epoch 37/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.1011 - accuracy: 0.9728 - val_loss: 0.3034 - val_accuracy: 0.8837\n",
      "Epoch 38/40\n",
      "15000/15000 [==============================] - 1s 48us/sample - loss: 0.0972 - accuracy: 0.9746 - val_loss: 0.3073 - val_accuracy: 0.8821\n",
      "Epoch 39/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.0939 - accuracy: 0.9751 - val_loss: 0.3096 - val_accuracy: 0.8824\n",
      "Epoch 40/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.0899 - accuracy: 0.9773 - val_loss: 0.3135 - val_accuracy: 0.8811\n",
      "25000/25000 - 1s - loss: 0.3330 - accuracy: 0.8726\n",
      "[0.3330114078426361, 0.87264]\n"
     ]
    }
   ],
   "source": [
    "# 1. 模型结构\n",
    "# 输入形状是用于电影评论的词汇数目（10,000 词）\n",
    "vocab_size = 10000\n",
    "model = keras.Sequential([\n",
    "    # 采用整数编码的词汇表，并查找每个词索引的嵌入向量\n",
    "    keras.layers.Embedding(vocab_size, 16),\n",
    "    # 通过对序列维度求平均值来为每个样本返回一个定长输出向量\n",
    "    keras.layers.GlobalAveragePooling1D(),\n",
    "    # 通过一个有 16 个隐层单元的全连接（Dense）层传输。\n",
    "    keras.layers.Dense(16, activation='relu'),\n",
    "    # 使用 Sigmoid 激活函数,表示概率或置信度。\n",
    "    keras.layers.Dense(1, activation='sigmoid')\n",
    "])\n",
    "model.summary()\n",
    "# 2. 模型设置\n",
    "model.compile(optimizer='adam',\n",
    "              loss='binary_crossentropy',\n",
    "              metrics=['accuracy'])\n",
    "# 3. 创建验证集\n",
    "x_val = train_data[:10000]\n",
    "partial_x_train = train_data[10000:]\n",
    "\n",
    "y_val = train_labels[:10000]\n",
    "partial_y_train = train_labels[10000:]\n",
    "# 4. 训练模型\n",
    "history = model.fit(partial_x_train,\n",
    "                    partial_y_train,\n",
    "                    epochs=40,\n",
    "                    batch_size=512,\n",
    "                    validation_data=(x_val, y_val),\n",
    "                    verbose=1)\n",
    "# 5. 评估模型\n",
    "results = model.evaluate(test_data,  test_labels, verbose=2)\n",
    "\n",
    "print(results)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 创建一个准确率（accuracy）和损失值（loss）随时间变化的图表\n",
    "history_dict = history.history\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "acc = history_dict['accuracy']\n",
    "val_acc = history_dict['val_accuracy']\n",
    "loss = history_dict['loss']\n",
    "val_loss = history_dict['val_loss']\n",
    "\n",
    "epochs = range(1, len(acc) + 1)\n",
    "\n",
    "# “bo”代表 \"蓝点\"\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "# b代表“蓝色实线”\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()\n",
    "\n",
    "plt.clf()   # 清除数字\n",
    "\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6rc1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
